package com.zhq.service;


import com.zhq.bean.Express;
import com.zhq.dao.BaseExpressDao;
import com.zhq.dao.imp.ExpressDaoMysql;
import com.zhq.exception.DuplicateCodeException;
import com.zhq.util.DateFormatUtil;
import com.zhq.util.RandomUtil;
import com.zhq.util.SMSUtil;

import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author:钟豪强
 * @Description:
 * @Date Created in  2020-08-17 15:28
 * @Modified By:
 */
public class ExpressService {
    private static BaseExpressDao dao = new ExpressDaoMysql();

    /**
     * 用于查询数据库中全部快递信息(总数和新增),代取件快递(总数加新增)
     *
     * @return [{size:总数,day:新增},{size:代取件总数,day:新增代取件}]
     */
    public static List<Map<String, Integer>> console() {
        return dao.console();
    }

    /**
     * 查询所有快递
     *
     * @param limit      表示是否分页,true是分页,false是不分页
     * @param offset     SQL语句的分页起始索引
     * @param pageNumber 页查询的数量
     * @return 返回快递的集合, 没有快递信息返回null
     */
    public static List<Express> findAll(boolean limit, int offset, int pageNumber) {
        return dao.findAll(limit, offset, pageNumber);
    }

    /**
     * 根据id查询快递信息
     * @param id    快递id
     * @return  返回该id快递,单号不存在返回null
     */
    public static Express findById(int id){
        return dao.findById(id);
    }

    /**
     * 根据快递单号查询快递信息
     *
     * @param number 快递信息
     * @return 返回该单号快递, 单号不存在返回null
     */
    public static Express findByNumber(String number) {
        return dao.findByNumber(number);
    }

    /**
     * 根据快递取件码查询快递信息
     *
     * @param code 取件码
     * @return 返回该取件码快递, 取件码不存在返回null
     */
    public static Express findByCode(String code) {
        return dao.findByCode(code);
    }

    /**
     * 根据用户手机号,查询他的所有快递信息
     *
     * @param userPhone 手机号
     * @return 快递信息的集合
     */
    public static List<Express> findByUserPhone(String userPhone) {
        return dao.findByUserPhone(userPhone);
    }

    /**
     * 用于根据取件人手机号码和快递状态,查询所有符合状态的快递信息
     * @param userPhone   手机号
     * @param status   快递状态
     * @return  快递信息的集合
     */
    public static List<Express> findByUserPhoneAndStatus(String userPhone, int status){
        return dao.findByUserPhoneAndStatus(userPhone, status);
    }


    /**
     * 根据录入人手机号码,查询录入的所有记录
     *
     * @param sysPhone 录入人手机号
     * @return 快递信息的集合
     */
    public static List<Express> findBySysPhone(String sysPhone) {
        return dao.findBySysPhone(sysPhone);
    }

    /**
     * 快递的录入
     *
     * @param express 录入的快递对象
     * @return 录入的结果, true表示成功, false表示失败
     */
    public static boolean insert(Express express) {
        //生成取件码,因为get到的是int类型的数值,要变为字符串
        //生成取件码
        express.setCode(RandomUtil.get()+"");
        try {
            boolean flag = dao.insert(express);
            if (flag) {
                SMSUtil.send(express.getUserPhone(),express.getCode());
            }
            return  flag;
        } catch (DuplicateCodeException e) {
            //捕获取件码重复异常,重新调用生成新取件码
            return insert(express);
        }
    }

    /**
     * (根据id)快递的修改
     *
     * @param id         要修改的快递id
     * @param newExpress 新的的快递对象(number,company,username,userPhone,status)
     * @return 修改的结果, true代表修改成功, false代表修改失败
     *
     * 修改情况:
     *       (1)当改了收取人的手机号码时,需要生成新的取件码(改的都是未取件的,因为改已取件的没有意义,但是会影响微信端的一个排名)
     *       (2)修改快递状态,由未取件->已取件
     *              不用发短信通知,更新出库时间
     *                     由已取件->未取件
     *              发新的取件码,改出库时间
     *
     *
     *              这里有点问题之后回来改!!!!!!!!!!!!!!!!
     *              这里有点问题之后回来改!!!!!!!!!!!!!!!!!
     *              这里有点问题之后回来改!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     */
    public static boolean update(int id, Express newExpress) {
        // if (newExpress.getUserPhone() != null) {
        //     dao.delete(id);
        //     //插入(重新录入快递)时,快递状态为未取件;
        //     //可以修改快递状态,但是实际中当录错了用户手机号码,重新录入时,应该不能修改快递状态为已取件的
        //     return  insert(newExpress);
        // }else{
        //     boolean update = dao.update(id, newExpress);
        //     Express e = dao.findByNumber(newExpress.getNumber());
        //     if (newExpress.getStatus() == 1) {
        //         dao.updateStatus(e.getCode());
        //     }
        //     return update;
        // }
        boolean update = dao.update(id, newExpress);
        //express是有code的
        //newExpress
        System.out.println(newExpress);
        Express e = dao.findById(id);
        System.out.println(e);
        if (newExpress.getUserPhone() != null && newExpress.getG_status() == -2) {
            //改手机号码,快递状态改变
            if (newExpress.getStatus() == 0) {
                //变为未取件
                dao.delete(id);
                return  insert(e);
            }else{
                //变为已取件
               return dao.updateStatus(e.getCode());
            }
        }else if (newExpress.getUserPhone() != null && newExpress.getG_status() == -1) {
            //改手机号码,快递状态没改变
            if (newExpress.getStatus() == 0){
                System.out.println("进错了地方");
                //还是未取件
                dao.delete(id);
                return insert(e);
            }else{
                //还是已取件
                System.out.println("进对了地方");
               return dao.updateUserPhone(id,newExpress.getUserPhone());
            }
        }else if (newExpress.getUserPhone() == null && newExpress.getG_status() == -2) {
            //不改手机号码,快递状态改变
            if (newExpress.getStatus() == 0) {
                System.out.println("进了变为未取件的地方");
                //变为未取件
                return updateCode(id);
            }else{
                System.out.println("进了变为已取件的地方");
                //变为已取件
                return dao.updateStatus(e.getCode());
            }
        }
        return update;
    }

    /**
     * 根据快递id,修改sysPhone
     * @param sysPhone  录入人手机号码
     * @return  true代表修改成功
     */
    public static boolean updateSysPhone(int id, String sysPhone) {
        return dao.updateSysPhone(id, sysPhone);
    }

    /**
     * 根据快递id,修改取件码
     * @param id    快递id
     * @return  true代表修改成功
     */
    public static boolean updateCode(int id) {
        //重新生成取件码,发短信
        int newCode = RandomUtil.get();
        try {
            boolean flag = dao.updateCode(id, newCode + "");
            if (flag) {
                Express e = dao.findByCode(newCode + "");
                SMSUtil.send(e.getUserPhone(),e.getCode());
            }
            return flag;
        } catch (DuplicateCodeException e) {
           return updateCode(id);
        }
    }

    /**
     * 更改快递的状态为1,表示取件的完成
     *
     * @param code 要修改的快递取件码
     * @return 修改的结果, true表示成功, false表示失败
     */
    public static boolean updateStatus(String code) {
        return dao.updateStatus(code);
    }

    /**
     * 根据id,删除单个快递信息
     *
     * @param id 要删除的快递信息
     * @return 删除的结果, true表示成功, false表示失败
     */
    public static boolean delete(int id) {
        return dao.delete(id);
    }
}
